package si.banst.tecajnice.web.mbean;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;

import si.banst.tecajnice.ejb.TecajniceBeanRemote;
import si.banst.tecajnice.ejb.ValuteBeanRemote;
import si.banst.tecajnice.ejb.napake.NapakaPriPosodobitvi;
import si.banst.tecajnice.ejb.napake.NapakaPriPovprasevanju;
import si.banst.tecajnice.entitete.StatusAktivnosti;
import si.banst.tecajnice.entitete.Tecaj;
import si.banst.tecajnice.entitete.TecajID;
import si.banst.tecajnice.entitete.Valuta;
import si.banst.tecajnice.entitete.VrstaTecajnice;

@Named
public class UrejanjeTecajevMBean {
	private static final Logger logger = Logger
			.getLogger(UrejanjeTecajevMBean.class.getName());

	@EJB(lookup="corbaname:iiop:tecajnice.banst.si:2811#TecajniceBean")
	private TecajniceBeanRemote tecajniceBean;

	@EJB(lookup="corbaname:iiop:tecajnice.banst.si:2811#ValuteBean")
	private ValuteBeanRemote valuteBean;

	private List<VrstaTecajnice> seznamVrstTecajnic;

	private List<Valuta> vseValute;

	private int sifraIzbraneVrstaTecajnice;

	private int sifraIzbraneValute;

	private Date izbranDatum;

	private Tecaj izbranTecaj;

	private double srednjiTecaj;

	private double prodajniTecaj;

	private double nakupniTecaj;

	public UrejanjeTecajevMBean() {
		super();
	}

	@PostConstruct
	public void init() {
		logger.info("Inicializiram TecajniceMBean");
		logger.fine("Pridobivam seznam vrst tečajnic");
		try {
			seznamVrstTecajnic = tecajniceBean.vrniVseVrsteTecajnic();
			if (seznamVrstTecajnic == null || seznamVrstTecajnic.isEmpty())
				throw new NapakaPriPovprasevanju("Seznam tečajnic je prazen.");

			vseValute = valuteBean.vrniVseValute();
			if (vseValute == null || vseValute.isEmpty())
				throw new NapakaPriPovprasevanju("Seznam valut je prazen.");

		} catch (NapakaPriPovprasevanju e) {
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Napaka pri inicializaciji", e.getMessage()));
		}
	}

	public boolean isTecajIzbran() {
		if (izbranTecaj == null)
			return false;
		return true;

	}

	public void prikaziTecaj() {
		logger.fine("Iščem tečaj za datum " + izbranDatum
				+ ", vrsto tečajne liste " + sifraIzbraneVrstaTecajnice
				+ ", valuto " + sifraIzbraneValute);
		if (getIzbranDatum() == null) {
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Tečajnice ni mogoče najti.", "Datum ni izbran."));
			return;
		}
		try {
			izbranTecaj = tecajniceBean.vrniTecaj(new TecajID(izbranDatum,
					sifraIzbraneVrstaTecajnice, sifraIzbraneValute));
			if (isNakupniTecajSet())
				nakupniTecaj = izbranTecaj.getNakupniTecaj().doubleValue();
			if (isSrednjiTecajSet())
				srednjiTecaj = izbranTecaj.getSrednjiTecaj().doubleValue();
			if (isProdajniTecajSet())
				prodajniTecaj = izbranTecaj.getProdajniTecaj().doubleValue();
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Napaka pri iskanju tečaja.", e.getMessage()));
			logger.severe("Tecaja za ta datum ni mogoče najti. "
					+ e.getMessage());
			e.printStackTrace();
		}
		if (izbranTecaj == null)
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Tečaja ni mogoče najti.", "IzbranDatum "
									+ ", vrsto tečajne liste "
									+ sifraIzbraneVrstaTecajnice + ", valuta "
									+ sifraIzbraneValute));
	}

	public int getSifraIzbraneVrstaTecajnice() {
		return sifraIzbraneVrstaTecajnice;
	}

	public void setSifraIzbraneVrstaTecajnice(int sifraIzbraneVrstaTecajnice) {
		this.sifraIzbraneVrstaTecajnice = sifraIzbraneVrstaTecajnice;
	}

	public int getSifraIzbraneValute() {
		return sifraIzbraneValute;
	}

	public void setSifraIzbraneValute(int sifraIzbraneValute) {
		this.sifraIzbraneValute = sifraIzbraneValute;
	}

	public Date getIzbranDatum() {
		return izbranDatum;
	}

	public void setIzbranDatum(Date izbranDatum) {
		this.izbranDatum = izbranDatum;
	}

	public Tecaj getIzbranTecaj() {
		return izbranTecaj;
	}

	public void setIzbranTecaj(Tecaj izbranTecaj) {
		this.izbranTecaj = izbranTecaj;
	}

	public List<VrstaTecajnice> getSeznamVrstTecajnic() {
		return seznamVrstTecajnic;
	}

	public List<Valuta> getVseValute() {
		return vseValute;
	}

	public boolean isSrednjiTecajSet() {
		if (izbranTecaj != null && izbranTecaj.getSrednjiTecaj() != null)
			return true;
		return false;
	}

	public boolean isProdajniTecajSet() {
		if (izbranTecaj != null && izbranTecaj.getProdajniTecaj() != null)
			return true;
		return false;
	}

	public boolean isNakupniTecajSet() {
		if (izbranTecaj != null && izbranTecaj.getNakupniTecaj() != null)
			return true;
		return false;
	}

	public void handleSave() {
		try {
			izbranTecaj.setDatumCasSpremembe(new Date());
			izbranTecaj.setStatusAktivnosti(StatusAktivnosti.NEAKTIVEN);
			izbranTecaj.setReferent(FacesContext.getCurrentInstance().getExternalContext().getRemoteUser());
			if (isNakupniTecajSet())
				izbranTecaj.setNakupniTecaj(new BigDecimal(nakupniTecaj));
			if (isSrednjiTecajSet())
				izbranTecaj.setSrednjiTecaj(new BigDecimal(srednjiTecaj));
			if (isProdajniTecajSet())
				izbranTecaj.setProdajniTecaj(new BigDecimal(prodajniTecaj));
			
			logger.info("Posodabljam tečaj. ");
			tecajniceBean.posodobiTecaj(izbranTecaj);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_INFO,
							"Tečaj uspešno posodobljen.", "IzbranDatum "
									+ ", vrsto tečajne liste "
									+ sifraIzbraneVrstaTecajnice + ", valuta "
									+ sifraIzbraneValute));
		} catch (NapakaPriPosodobitvi e) {
			logger.severe("Tecaja ni mogoče posodobiti. " + e.getMessage());
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Tečaja ni mogoče posodobiti.", "IzbranDatum "
									+ ", vrsto tečajne liste "
									+ sifraIzbraneVrstaTecajnice + ", valuta "
									+ sifraIzbraneValute));
			prikaziTecaj();
		}

	}

	public double getSrednjiTecaj() {
		return srednjiTecaj;
	}

	public void setSrednjiTecaj(double srednjiTecaj) {
		this.srednjiTecaj = srednjiTecaj;
	}

	public double getProdajniTecaj() {
		return prodajniTecaj;
	}

	public void setProdajniTecaj(double prodajniTecaj) {
		this.prodajniTecaj = prodajniTecaj;
	}

	public double getNakupniTecaj() {
		return nakupniTecaj;
	}

	public void setNakupniTecaj(double nakupniTecaj) {
		this.nakupniTecaj = nakupniTecaj;
	}
}
